package cn.cjxy.springboot_zonghe_practice.service;

import cn.cjxy.springboot_zonghe_practice.domain.Dept;
import cn.cjxy.springboot_zonghe_practice.query.BaseQuery;
import cn.cjxy.springboot_zonghe_practice.utils.R;

import java.util.List;

/**
 * 部门服务接口
 * 提供部门的增删改查、分页查询、批量操作等功能
 * 
 * @author huangjie
 * @since 2025-07-06
 */
public interface DeptService {
    
    /**
     * 添加部门
     * 
     * @param dept 部门信息对象
     * @return 操作结果，成功返回R.ok()，失败返回R.fail(错误信息)
     */
    R addDept(Dept dept);

    /**
     * 修改部门信息
     * 
     * @param dept 部门信息对象（必须包含id）
     * @return 操作结果
     */
    R updateDept(Dept dept);

    /**
     * 根据ID删除部门
     * 注意：只有没有员工的部门才能被删除
     * 
     * @param id 部门ID
     * @return 操作结果
     */
    R delDeptById(Long id);

    /**
     * 根据ID查询部门信息
     * 
     * @param id 部门ID
     * @return 查询结果，包含部门详细信息
     */
    R selectById(Long id);

    /**
     * 查询所有部门
     * 
     * @return 所有部门列表
     */
    R selectAll();
    
    /**
     * 分页查询部门
     * 
     * @param query 分页查询参数，包含页码和每页大小
     * @return 分页结果，包含部门列表、总数、当前页码、每页大小
     */
    R selectDeptByPage(BaseQuery query);
    
    /**
     * 批量添加部门
     * 注意：会校验部门名称唯一性和部门经理唯一性
     * 
     * @param depts 部门列表
     * @return 操作结果
     */
    R batchAddDept(List<Dept> depts);
    
    /**
     * 批量删除部门
     * 注意：只有没有员工的部门才能被删除
     * 
     * @param ids 部门ID列表
     * @return 操作结果
     */
    R batchDeleteDept(List<Long> ids);
}
